package main

import (
	"context"
	"flag"
	"log"
	"net/http"
	"os"
	"os/signal"
	"path/filepath"
	"syscall"
	"time"

	"github.com/linchao/zkp_auth/db_manager"
	"github.com/linchao/zkp_auth/models"
)

func main() {
	// 解析命令行参数
	var (
		dbPath = flag.String("db-path", "./data/auth.db", "SQLite数据库文件路径")
		addr   = flag.String("addr", ":8080", "HTTP服务器监听地址")
	)
	flag.Parse()

	// 确保数据目录存在
	dbDir := filepath.Dir(*dbPath)
	if _, err := os.Stat(dbDir); os.IsNotExist(err) {
		if err := os.MkdirAll(dbDir, 0755); err != nil {
			log.Fatalf("创建数据目录失败: %v", err)
		}
	}

	// 初始化数据库
	if err := models.InitDB(*dbPath); err != nil {
		log.Fatalf("初始化数据库失败: %v", err)
	}
	defer models.CloseDB()
	log.Printf("数据库已初始化: %s", *dbPath)

	// 创建设备管理器
	manager := db_manager.NewSQLiteDeviceManager()

	// 创建并启动HTTP服务器
	server := db_manager.NewHTTPServer(manager, *addr)
	go func() {
		if err := server.Start(); err != nil {
			if err != http.ErrServerClosed {
				log.Fatalf("HTTP服务器启动失败: %v", err)
			}
		}
	}()

	// 等待中断信号
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan

	// 优雅地关闭HTTP服务器
	log.Println("正在关闭HTTP服务器...")
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	if err := server.Stop(ctx); err != nil {
		log.Printf("HTTP服务器关闭出错: %v", err)
	}

	log.Println("服务器已关闭")
}
